package com.atguigu.gmall.mq.config;


import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class DeadLetterMqConfig {

    public static final String exchange_dead = "exchange.dead";
    //用于第一次普通交换机发给队列的routingKey  此时成为死信队列
    public static final String routing_dead_1 = "routing.dead.1";
    //用于第二次由死信交换机发给死信队列routingKey  此时成为普通队列    普通交换机和死信交换机可以是一个交换机
    public static final String routing_dead_2 = "routing.dead.2";
    public static final String queue_dead_1 = "queue.dead.1";
    public static final String queue_dead_2 = "queue.dead.2";


    //交换机  MQ
    @Bean
    public Exchange deadLetterExchange(){
        return ExchangeBuilder.directExchange(exchange_dead).build();
    }
    //死信队列
    @Bean
    public Queue deadLetterQueue(){
        Map<String, Object> arguments = new HashMap<>();
        //1:转发的死信交换机是谁？
        arguments.put("x-dead-letter-exchange",exchange_dead);
        //2:转发的死信RoutingKey是谁？
        arguments.put("x-dead-letter-routing-key",routing_dead_2);
        //3:TTL是多少  全局  毫秒
        arguments.put("x-message-ttl",10 * 1000);
        //TTL 在此设置为全局设置
        //在发送消息的时候也可以指定TTL 局部设置
        //优先级  局部设置>全局设置   不设置局部TTL的时候 才使用全局设置     谁的时间短设置的时间就是谁
        return QueueBuilder.durable(queue_dead_1).withArguments(arguments).build();
    }
    //队列 普通
    @Bean
    public Queue queue(){
        return QueueBuilder.durable(queue_dead_2).build();
    }

    //绑定  死信队列
    @Bean
    public Binding bindingDeadLetterQueue(){
        return BindingBuilder.bind(deadLetterQueue()).
                to(deadLetterExchange()).with(routing_dead_1).noargs();
    }
    //绑定 普通队列
    @Bean
    public Binding bindingQueue(){
        return BindingBuilder.bind(queue()).
                to(deadLetterExchange()).with(routing_dead_2).noargs();
    }
}